package com.foo.designpattern.bridge;

import junit.framework.TestCase;

/**
 * com.foo.designpattern.bridge
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-05-05 20:57.
 *
 * @Description 测试类：桥接模式(Bridge)
 * 桥接模式(桥梁模式)是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式.
 * 其用意是：将抽象化(Abstraction)与实现化(Implementation)解耦，使得二者可以独立的变化。
 * <p/>
 * 桥接模式(桥梁模式)的结构，含有两个等级结构：
 * 1、由抽象化角色和修正抽象化角色组成的抽象化等级结构；
 * 2、由实现化角色和具体实现化角色所组成的实现化等级结构。
 * <p/>
 * 抽象化等级结构中的方法通过向对应的实现化对象的委派实现自己的功能，
 * 这意味着抽象化角色可以通过向不同的实现化对象委派，来达到动态的转换自己功能的目的
 * <p/>
 * 桥接模式所所涉及的角色：
 * 1、抽象化(Abstraction)角色：抽象化给出的定义，并保存一个对实现化对象的引用。
 * 2、修正抽象化(RefinedAbstraction)角色：扩展抽象化角色，改变和修正父类对抽象化的定义。
 * 3、实现化(Implementor)角色：给出实现化角色的接口，但不给出具体实现。
 * 4、具体实现化(ConcreteImplementor)角色：给出实现化角色接口的具体实现。
 * <p/>
 * 桥接模式的优点：
 * 1、分离抽象和实现部分：桥接模式分离了抽象部分和实现部分，从而极大地提高了系统的灵活性。
 * 让抽象部分和实现部分独立出来，分别定义接口，这有助于对系统进行分层，从而产生更好的结构化的系统。
 * 2、更好的扩展性：桥接模式使得抽象部分和实现部分可以分别独立地扩展，而不会相互影响，从而提高了系统的扩展性。
 * <p/>
 * 桥接模式在java中的使用：
 * 桥接模式在java应用中的一个非常典型的例子就是JDBC驱动器。JDBC为所有的关系型数据库提供一个通用的界面。
 * 一个应用系统动态地选择一个合适的驱动器，然后通过驱动器向数据库引擎发出指令。这个过程就是将抽象角色的行为委派给实现角色的过程。
 * 应用系统作为一个等级结构，与JDBC驱动器这个等级结构是相互独立的，它们之间没有静态的强关联。应用系统通过委派与JDBC驱动器相互作用。
 * JDBC的这种架构，将抽象部分和具体实现部分分离开来，从而使得抽象部分和具体实现部分都可以独立的扩展。
 * 对于应用程序而言，只要选用不同的驱动，就可以让程序操作不同的数据库，而无需更改应用程序，从而实现在不同的数据库上移植；
 * 对于驱动程序而言，为数据库实现不同的驱动程序，并不会影响应用程序。
 */

public class BridgeTestCase extends TestCase {
    public void testBridge() {
        System.out.println("= = = = ↓↓↓桥接模式，测试开始↓↓↓ = = = =");
        Clothing jacket = new Jacket();
        Clothing trouser = new Trouser();

        // 测试男人穿衣服
        Person man = new Man();
        jacket.personDressCloth(man);
        trouser.personDressCloth(man);

        // 测试女人穿衣服
        Person lady = new Lady();
        jacket.personDressCloth(lady);
        trouser.personDressCloth(lady);

        /**
         * 如果有其他人(比如E.T)加入，只需要添加一个类继承自Person就可以了
         * 实现化角色和具体实现化角色都不需要修改。
         */
        System.out.println("= = = = ↑↑↑桥接模式，测试结束↑↑↑ = = = =");
    }
}
